package cn.hchaojie.javase.day03;

import java.util.Arrays;

import org.junit.Test;

public class DemoBubbleSort {
	// 对数组里面的元素从小到大排序
	@Test
	public void test1() {
		int[] array = {5, 8, 3, 4, 2, 10};		// 数组长度是n
		
		// 第一趟： 5, 3, 4, 2, 8, 10		-> 最大的交换到最后面去了，  n-1
		// 第二趟： 3, 4, 2, 5, 8, 10		-> 次大的交换到后面去了      n-2
		// 			3, 2, 4, 5, 8, 10
		// 		    2, 3, 4, 5, 8, 10
		// 最后一趟：2, 3, 4, 5，8，10									1
		
		int n = array.length;
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - 1 - i; j++) {
				if (array[j] > array[j + 1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			}
		}
		
		System.out.println(Arrays.toString(array));
	}
	
	// 数组的二分查找(折半查找)
	// 前提：数组是有序的，从小到大已经排序好了
	@Test
	public void test2() {
		int[] array = {2, 5, 10, 20, 25, 80, 230};
		
		int x = 25;
		
		int start = 0;
		int end = array.length - 1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (x > array[mid]) {
				start = mid + 1;
			} else if (x < array[mid]) {
				end = mid - 1;
			} else {
				System.out.println(mid);
				break;
			}
		}
		
		System.out.println("查找结束！");
	}
	
	// java排序和查找的api appliction programming interface：别人写好的代码，可以直接调用
	@Test
	public void test3() {
		int[] array = {5, 8, 3, 4, 2, 10};
		
		Arrays.sort(array);
		System.out.println(Arrays.toString(array));
		
		// {2, 3, 4, 5, 8, 10}
		int index = Arrays.binarySearch(array, 4);
		System.out.println(index);
		
		// 8 >>> 1 无符号右移		8 >> 1  有符号的右移
	}
	
	// {1, 3, 4, 7, 9, 10}
	// 任意取两个数字, 打印所有可能的组合（不考虑顺序）
	// {1, 3}, {1, 4}
	@Test
	public void test4() {
		int[] array = {1, 3, 4, 7, 9, 10};
		
		int n = array.length;
		
		for (int i = 0; i < n - 1; i++) {
			for (int j = i + 1; j < n; j++) {
				System.out.print(array[i] + "," + array[j] + " \t");
			}
			
			System.out.println();
		}
	}
}
